/*!
 * @file areaMenager.hh
 * @brief Zarządzanie segmentami/wyświetlanie
 */

#ifndef __MODES_WORLD_AREA_AREAMENAGER_HH
#define __MODES_WORLD_AREA_AREAMENAGER_HH

#include <string>
#include "modes/world/area/areaTextures.hh"
#include "modes/world/area/areaSquare.hh"
#include "engine/basic/model.hh"
#include "engine/basic/object.hh"
#include "engine/basic/particle.hh"
#include "engine/basic/inifile.hh"

enum area_drawMode {area_dm_all, area_dm_lowpoly, area_dm_noshader};
/*!
 * @brief Menadżer terenów. Odpowiedzialny za wyświetlenie
 * siatki bloków.
 */
class areaMenager {
public:
	//todo test
	particle *part;
	model *test;
	object *obj;

	/*!
	 * @brief Konstruktor. Wczytywanie shadera
	 * @return Obiekt
	 */
	areaMenager();

	/*!
	 * @brief Wczytywanie mapy
	 * @param path Folder z mapą
	 */
	void loadMap(std::string path);

	/*!
	 * @brief Rysowanie terenu. Malowanie odbicia przebiega w mniejszych detalach.
	 * @param isReflection Czy malowanie odbicia?
	 */
	void draw(area_drawMode dm);

	point2f getWorldSize();

	bool checkPos(point3f pos);

	areaTextures *texturePack;

private:
	/*!
	 * @brief Wczytywanie mapy wysokości
	 * @param dir Folder. Wczytany zostanie plik dir/hmap.png
	 */
	void loadHeightmap(std::string dir);

	/*!
	 * @brief Wczytywanie pliku konfiguracyjnego
	 * @param dir Folder. Wczytany zostanie plik dir/cfg.txt
	 */
	void loadConfig(std::string dir);

	/*!
	 * @brief Wczytywanie obszarów
	 */
	void loadSquares();

	/*!
	 * @brief tablica terenów
	 */
	areaSquare *wholeMap;


	areaSquare *emptySpace;
	//texture *emptySpaceTexture;
	/*!
	 * @brief maksymalna wysokość
	 */
	float mapTop;

	/*!
	 * @brief maksymalna głębokość
	 */
	float mapBottom;

	/*!
	 * @brief Wskaźnik. Tutaj potem jest tablica punktów
	 * [surowa, z mapy wysokości]
	 */
	float *heightmap;

	/*!
	 * @brief Wymiary świata - szerokośc
	 */
	int sizeX;

	/*!
	 * @brief Wymiary świata - wysokość
	 */
	int sizeY;
};

#else
class areaMenager;
#endif
